// 请求拦截器
const requestInterceptor = (config) => {
  // 获取token
  const token = uni.getStorageSync('token');
  if (token) {
    config.header = {
      ...config.header,
      'Authorization': `Bearer ${token}`
    };
  }
  
  // 添加请求日志
  console.log(`[Request] ${config.method.toUpperCase()} ${config.url}`);
  
  return config;
};

// 响应拦截器
const responseInterceptor = (response) => {
  const { statusCode, data } = response;
  
  // 添加响应日志
  console.log(`[Response] ${statusCode}`, data);
  
  // 请求成功
  if (statusCode >= 200 && statusCode < 300) {
    // 如果data本身就是数组，直接返回
    if (Array.isArray(data)) {
      return data;
    }
    // 如果data是对象，且包含data字段，返回内部的data
    if (data && typeof data === 'object' && 'data' in data) {
      return data.data;
    }
    // 其他情况直接返回data
    return data;
  }
  
  // 处理错误
  if (statusCode === 401) {
    // token过期，清除token并跳转到登录页
    uni.removeStorageSync('token');
    uni.showToast({
      title: '登录已过期，请重新登录',
      icon: 'none',
      duration: 2000
    });
    
    // 延迟跳转，让用户看到提示
    setTimeout(() => {
      uni.navigateTo({
        url: '/pages/login/index'
      });
    }, 2000);
    
    return Promise.reject(new Error('登录已过期'));
  }
  
  // 处理404错误
  if (statusCode === 404) {
    uni.showToast({
      title: '请求的资源不存在',
      icon: 'none',
      duration: 2000
    });
    return Promise.reject(new Error('请求的资源不存在'));
  }
  
  // 其他错误
  const error = new Error(data.message || '请求失败');
  error.response = response;
  return Promise.reject(error);
};

// 请求方法
const request = (options) => {
  return new Promise((resolve, reject) => {
    // 请求拦截
    const config = requestInterceptor(options);
    
    // 发起请求
    uni.request({
      url: config.url,
      method: config.method || 'GET',
      data: config.data,
      header: {
        'Content-Type': 'application/json',
        ...config.header
      },
      success: (res) => {
        try {
          const data = responseInterceptor(res);
          resolve(data);
        } catch (error) {
          reject(error);
        }
      },
      fail: (err) => {
        console.error('网络请求失败:', err);
        uni.showToast({
          title: '网络请求失败，请检查网络连接',
          icon: 'none',
          duration: 2000
        });
        reject(err);
      }
    });
  });
};

export { request }; 